package validate

// 真实验证的方法所在的文件
import (
	"github.com/go-playground/validator/v10"
	"regexp"
	"shopstar/models"
	"shopstar/models/goods"
)

// 定义一个自定义验证器都需要继承的接口
type Validate interface {
	Tag() string                // 自定义验证器的标签 接收参数的时候 binding里面所写的自定义验证标签
	ValidateFn() validator.Func // 自定义验证的方法
	Error() string              // 验证不通过时，给前端提示的错误信息
}

var validators = []Validate{
	new(Phone),
	new(SkuId),
}

func Validators() []Validate {
	return validators
}

func RegisterValidate(val ...Validate) {
	validators = append(validators, val...)
}

type Phone struct{}

func (v *Phone) Tag() string {
	return "phone"
}

func (v *Phone) ValidateFn() validator.Func {
	return func(fl validator.FieldLevel) bool {
		date, ok := fl.Field().Interface().(string)
		if !ok {
			return false
		}

		reg := `^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199)\d{8}$`
		ok, _ = regexp.MatchString(reg, date)

		return ok
	}
}

func (v *Phone) Error() string {
	return "手机号码填写不正确，请重新输入"
}

//var Validators = map[string]validator.Func{
//	"phone": Phone,
//}

// 验证手机号的方法
//func Phone(fl validator.FieldLevel) bool {
//	date, ok := fl.Field().Interface().(string)
//	if !ok {
//		return false
//	}
//
//	reg := `^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199)\d{8}$`
//	ok, _ = regexp.MatchString(reg, date)
//
//	return ok
//}

type SkuId struct{}

func (v *SkuId) Tag() string {
	return "skuId"
}
func (v *SkuId) ValidateFn() validator.Func {
	return func(fl validator.FieldLevel) bool {
		date, ok := fl.Field().Interface().(int64)

		if !ok {
			return false
		}
		var sku goods.GoodsSku

		err := models.DB.Where("id = ?", date).First(&sku)
		if err.Error != nil {
			Err.err = "商品查询不到"
			return false
		}

		if sku.Stock == 0 {
			Err.err = "商品已售完"
			return false
		}

		return ok
	}
}
func (v *SkuId) Error() string {
	return ""
}
